Spring JDBC-তে ক্যাশিং ব্যবহার করলে ডেটাবেস অপারেশনের পারফরম্যান্স বৃদ্ধি পায়। ক্যাশিং মূলত ডেটাবেসের বারবার একই ডেটা রিকোয়েস্ট করার সময় অ্যাপ্লিকেশন লেয়ারে সেই ডেটা সঞ্চয় করে রাখে, ফলে ডেটাবেসে বারবার রিকোয়েস্ট না করেও দ্রুত ফলাফল পাওয়া যায়।
Spring Framework সরাসরি ক্যাশিং সমর্থন করে। এটি চালু করতে আপনাকে নিচের ধাপগুলো অনুসরণ করতে হবে:
Maven বা Gradle এর মাধ্যমে Spring Cache যোগ করুন।
Maven Dependency:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.3.21</version>
</dependency>
@EnableCaching
অ্যানোটেশন ব্যবহার করে Spring-এর ক্যাশিং মেকানিজম চালু করুন।
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableCaching
public class CacheConfig {
// Cache configuration
}
Spring-এর ক্যাশিং মেকানিজম ব্যবহার করতে @Cacheable
অ্যানোটেশন ব্যবহার করা হয়। এটি একটি মেথডের আউটপুট ক্যাশ করে রাখে।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class EmployeeService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Cacheable("employees")
public List<Employee> getAllEmployees() {
String query = "SELECT * FROM employees";
return jdbcTemplate.query(query, (rs, rowNum) -> {
Employee employee = new Employee();
employee.setId(rs.getInt("id"));
employee.setName(rs.getString("name"));
employee.setDepartment(rs.getString("department"));
return employee;
});
}
}
getAllEmployees()
মেথড কল করার সময় ডেটা ডেটাবেস থেকে ফেচ করা হবে এবং ক্যাশে সংরক্ষণ করা হবে।Spring Framework-এ ক্যাশিংয়ের জন্য বিভিন্ন প্রভাইডার ব্যবহার করা যায়, যেমন EhCache, Caffeine, বা Hazelcast। নিচে একটি সাধারণ উদাহরণ দেওয়া হলো যেখানে ConcurrentMapCache ব্যবহার করা হয়েছে।
import org.springframework.cache.CacheManager;
import org.springframework.cache.concurrent.ConcurrentMapCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
return new ConcurrentMapCacheManager("employees");
}
}
ক্যাশ ইনভ্যালিড বা রিফ্রেশ করার জন্য @CacheEvict
এবং @CachePut
ব্যবহার করা হয়।
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;
@Service
public class EmployeeService {
@CacheEvict(value = "employees", allEntries = true)
public void clearEmployeeCache() {
System.out.println("Employee cache cleared");
}
}
import org.springframework.cache.annotation.CachePut;
import org.springframework.stereotype.Service;
@Service
public class EmployeeService {
@CachePut(value = "employees", key = "#employee.id")
public Employee updateEmployee(Employee employee) {
// Update logic in database
return employee;
}
}
Spring Boot ব্যবহার করলে ক্যাশিং আরও সহজ হয়।
spring.cache.type=simple
Spring Boot অ্যাপ্লিকেশনে ক্যাশ ব্যবহারের জন্য উপরের @EnableCaching
, @Cacheable
, এবং @CacheEvict
মেথডগুলো ঠিক একইভাবে কাজ করে।
Spring JDBC-তে ক্যাশিং একটি শক্তিশালী ফিচার, যা অ্যাপ্লিকেশনের পারফরম্যান্স উল্লেখযোগ্যভাবে বাড়িয়ে তোলে। Spring-এর বিল্ট-ইন ক্যাশিং মেকানিজমের পাশাপাশি বিভিন্ন ক্যাশিং প্রভাইডার ব্যবহার করে এটি আরও কাস্টমাইজ করা যায়। তবে ক্যাশ ব্যবস্থাপনার সঠিক নকশা এবং ইনভ্যালিডেশন স্ট্র্যাটেজি গুরুত্বপূর্ণ।
Caching হলো একটি মেকানিজম যা ডেটা বা ফলাফলকে একটি দ্রুত এক্সেসযোগ্য স্টোরেজে সংরক্ষণ করে, যাতে একই ডেটার জন্য পরবর্তী অনুরোধগুলোতে ডাটাবেস বা কম্প্লেক্স প্রসেসিংয়ে যাওয়ার প্রয়োজন হয় না। এটি অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করার জন্য ব্যবহৃত হয়।
স্প্রিং জেডিবিসি ব্যবহার করে অ্যাপ্লিকেশন যখন ডাটাবেসের সাথে কাজ করে, তখন ক্যাশিং এর ব্যবহার বেশ কয়েকটি সুবিধা প্রদান করে:
Spring JDBC তে ক্যাশিং সরাসরি সমর্থন করে না। তবে, স্প্রিং-এর ক্যাশিং মডিউল এবং বিভিন্ন ক্যাশিং লাইব্রেরি (যেমন EhCache, Caffeine, Redis) ব্যবহার করে ক্যাশিং ইমপ্লিমেন্ট করা যায়।
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>3.1.3</version>
</dependency>
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
return new CaffeineCacheManager("studentsCache");
}
}
@Service
public class StudentService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Cacheable("studentsCache")
public Student getStudentById(int id) {
System.out.println("Fetching from database...");
String sql = "SELECT id, name, age FROM students WHERE id = ?";
return jdbcTemplate.queryForObject(sql, new Object[]{id}, (rs, rowNum) -> {
Student student = new Student();
student.setId(rs.getInt("id"));
student.setName(rs.getString("name"));
student.setAge(rs.getInt("age"));
return student;
});
}
}
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
StudentService studentService = context.getBean(StudentService.class);
// প্রথমবার ডাটাবেস থেকে ডেটা রিট্রিভ হবে
Student student1 = studentService.getStudentById(1);
System.out.println(student1);
// একই রেকর্ড দ্বিতীয়বার রিকোয়েস্ট করলে ক্যাশ থেকে ডেটা রিট্রিভ হবে
Student student2 = studentService.getStudentById(1);
System.out.println(student2);
}
আউটপুট:
Fetching from database...
Student{id=1, name='John Doe', age=20}
Student{id=1, name='John Doe', age=20}
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
@Configuration
@EnableCaching
public class RedisCacheConfig {
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory();
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory());
return template;
}
@Bean
public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
return RedisCacheManager.builder(connectionFactory).build();
}
}
@Service
public class StudentService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Cacheable("studentsCache")
public Student getStudentById(int id) {
System.out.println("Fetching from database...");
String sql = "SELECT id, name, age FROM students WHERE id = ?";
return jdbcTemplate.queryForObject(sql, new Object[]{id}, (rs, rowNum) -> {
Student student = new Student();
student.setId(rs.getInt("id"));
student.setName(rs.getString("name"));
student.setAge(rs.getInt("age"));
return student;
});
}
}
@Cacheable
:
উদাহরণ:
@Cacheable("cacheName")
public Data fetchData(int id) { ... }
@CachePut
:
উদাহরণ:
@CachePut("cacheName")
public Data updateData(int id, Data newData) { ... }
@CacheEvict
:
উদাহরণ:
@CacheEvict("cacheName")
public void deleteData(int id) { ... }
Spring JDBC-তে ক্যাশিং ব্যবহার করা অ্যাপ্লিকেশনের পারফরম্যান্স এবং স্কেলেবিলিটি বৃদ্ধির একটি কার্যকর পদ্ধতি। Spring এর বিল্ট-ইন ক্যাশিং মেকানিজম, যেমন @Cacheable
, সহজভাবে ক্যাশিং ইমপ্লিমেন্ট করতে সহায়ক। Redis এবং EhCache এর মতো টুল ব্যবহার করে ক্যাশিং আরও শক্তিশালী করা যায়।
স্প্রিং জেডিবিসি (Spring JDBC) তে EhCache এবং Redis এর সাথে ইন্টিগ্রেশন একটি কার্যকরী পদ্ধতি হতে পারে, যেহেতু ক্যাশিং ডেটাবেস অ্যাক্সেসের সংখ্যা কমায়, কর্মক্ষমতা বৃদ্ধি করে এবং দ্রুত অ্যাক্সেস নিশ্চিত করে। ক্যাশিং ব্যবহারের মাধ্যমে অ্যাপ্লিকেশন আরও দ্রুত এবং স্কেলেবল হয়, কারণ ক্যাশে হওয়া ডেটা পুনরায় ডেটাবেস থেকে না এনে সরাসরি ক্যাশ থেকে রিট্রিভ করা যায়।
EhCache হল একটি জনপ্রিয়, ওপেন সোর্স ক্যাশিং লাইব্রেরি যা ডেটা মেমোরি-ভিত্তিক স্টোরেজে সংরক্ষণ করে, যা অ্যাপ্লিকেশনের কর্মক্ষমতা বৃদ্ধি করতে সহায়তা করে।
<dependencies>
<!-- Spring Cache Dependency -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.3.20</version>
</dependency>
<!-- EhCache Dependency -->
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.9.1</version>
</dependency>
</dependencies>
এখন EhCache কনফিগার করার জন্য স্প্রিং কনফিগারেশন ফাইল ব্যবহার করতে হবে। এখানে একটি উদাহরণ দেওয়া হলো।
EhCache কনফিগারেশন (XML Config)
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache-3.0.xsd">
<!-- Enable caching in Spring -->
<cache:annotation-driven />
<!-- EhCache Configuration -->
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
<constructor-arg ref="ehCache" />
</bean>
<bean id="ehCache" class="org.ehcache.core.EhcacheManager">
<constructor-arg value="classpath:ehcache.xml" />
</bean>
</beans>
EhCache কনফিগারেশন (ehcache.xml)
<ehcache xmlns="http://www.ehcache.org/v3">
<cache alias="employeeCache">
<key-type>java.lang.Integer</key-type>
<value-type>com.example.Employee</value-type>
<resources>
<heap unit="entries" value="1000" />
<offheap unit="MB" value="10" />
</resources>
</cache>
</ehcache>
এখন, আপনি @Cacheable
অ্যানোটেশন ব্যবহার করে স্প্রিং জেডিবিসি মেথডে ক্যাশিং প্রয়োগ করতে পারেন।
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;
@Component
public class EmployeeDao {
@Cacheable(value = "employeeCache", key = "#id")
public Employee getEmployeeById(int id) {
// Database query for fetching employee by id
String sql = "SELECT * FROM Employee WHERE id = ?";
return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(Employee.class));
}
}
ব্যাখ্যা:
@Cacheable
অ্যানোটেশনটি EmployeeDao
ক্লাসে ব্যবহৃত হয়েছে যাতে যখন ডেটাবেসে কোনো কর্মচারীর তথ্য অনুসন্ধান করা হয়, তখন প্রথমবার এটি ডেটাবেস থেকে আসবে এবং পরবর্তীতে ক্যাশ থেকে তা রিটার্ন করা হবে।Redis একটি ইন-মেমরি ডেটাবেস, যা মূলত ডেটা স্টোরেজ, ক্যাশিং, এবং মেসেজ ব্রোকার হিসেবে ব্যবহৃত হয়। Redis স্প্রিং অ্যাপ্লিকেশনে একটি জনপ্রিয় ক্যাশিং সমাধান হিসেবে ব্যবহৃত হয়।
<dependencies>
<!-- Spring Data Redis Dependency -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>2.5.6</version>
</dependency>
<!-- Lettuce Redis Client Dependency -->
<dependency>
<groupId>io.lettuce.core</groupId>
<artifactId>lettuce-core</artifactId>
<version>6.0.1</version>
</dependency>
</dependencies>
স্প্রিং অ্যাপ্লিকেশন কনফিগারেশনে Redis সেটআপ করতে হবে।
RedisConfig.java:
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.redis.RedisCacheManager;
import org.springframework.cache.redis.RedisCacheConfiguration;
import org.springframework.cache.redis.RedisCache;
import org.springframework.cache.CacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.connection.RedisConnectionFactory;
@Configuration
@EnableCaching
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> template = new StringRedisTemplate(connectionFactory);
return template;
}
@Bean
public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
RedisCacheManager cacheManager = RedisCacheManager.create(connectionFactory);
return cacheManager;
}
}
এখন, আপনি @Cacheable
অ্যানোটেশনটি Redis ক্যাশিং ব্যবহারের জন্য ব্যবহার করতে পারেন।
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;
@Component
public class EmployeeDao {
@Cacheable(value = "employeeCache", key = "#id")
public Employee getEmployeeById(int id) {
// Database query for fetching employee by id
String sql = "SELECT * FROM Employee WHERE id = ?";
return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(Employee.class));
}
}
ব্যাখ্যা:
@Cacheable
অ্যানোটেশনটি ব্যবহার করা হয়েছে, যা Redis ক্যাশে employeeCache
নামক ক্যাশে ডেটা সংরক্ষণ করবে। এটি ক্যাশে থেকে ডেটা ফিরিয়ে দেয় এবং যদি ডেটা ক্যাশে না থাকে তবে ডেটাবেস থেকে নিয়ে আসে।উপরোক্ত উদাহরণ এবং কনফিগারেশন অনুসরণ করে আপনি স্প্রিং জেডিবিসি অ্যাপ্লিকেশনে EhCache বা Redis সঠিকভাবে ইন্টিগ্রেট করতে পারবেন, যা আপনার অ্যাপ্লিকেশনকে দ্রুত এবং স্কেলেবল করবে।
Query Caching হল একটি প্রক্রিয়া যেখানে একটি SQL কুয়েরির ফলাফল ক্যাশে সংরক্ষিত থাকে, যাতে পরবর্তী কুয়েরি এক্সিকিউট করার সময় তা পুনরায় ডেটাবেস থেকে না নিয়ে ক্যাশ থেকে সরাসরি ফলাফল নেয়া যায়। Spring JDBC-এ JdbcTemplate
ব্যবহার করে Query Caching বাস্তবায়ন করা যায়, তবে এটি সাধারণত Spring-এর অন্যান্য কaching প্রযুক্তি বা ক্যাশ ম্যানেজমেন্ট সিস্টেমের সাথে সমন্বয়ে করা হয়, যেমন Spring Cache, Ehcache, বা Redis।
Spring JDBC JdbcTemplate
সরাসরি কুয়েরি ক্যাশিং সাপোর্ট করে না, তবে আপনি JdbcTemplate
এর সঙ্গে ক্যাশিং ফ্রেমওয়ার্ক সংযুক্ত করে ক্যাশিং বাস্তবায়ন করতে পারেন।
এখানে দুটি পদ্ধতির বিস্তারিত আলোচনা করা হলো।
Spring Frameworkে ক্যাশিং বাস্তবায়নের জন্য @Cacheable
অ্যানোটেশন ব্যবহার করা যেতে পারে। এটি Spring Cache abstraction API এর মাধ্যমে ক্যাশিং পরিচালনা করে। Spring Cache ব্যবহার করতে হলে, আপনাকে একটি ক্যাশ ম্যানেজার কনফিগার করতে হবে, যেমন Ehcache বা Redis।
প্রথমে Spring Cache কনফিগারেশন সেটআপ করতে হবে এবং তারপরে JdbcTemplate
এর মাধ্যমে SQL কুয়েরি ক্যাশ করা যাবে।
<dependencies>
<!-- Spring Cache Dependency -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.3.23</version>
</dependency>
<!-- Ehcache Dependency -->
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.9.7</version>
</dependency>
</dependencies>
Spring Cache কনফিগারেশন করতে @EnableCaching
অ্যানোটেশন ব্যবহার করা হয়।
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.CacheManager;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public EhCacheManagerFactoryBean ehCacheManager() {
EhCacheManagerFactoryBean cacheManager = new EhCacheManagerFactoryBean();
cacheManager.setConfigLocation("classpath:ehcache.xml"); // ehcache.xml ফাইলটি কনফিগার করতে হবে
return cacheManager;
}
@Bean
public CacheManager cacheManager() {
return new EhCacheCacheManager(ehCacheManager().getObject());
}
}
import org.springframework.cache.annotation.Cacheable;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private final JdbcTemplate jdbcTemplate;
public UserService(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Cacheable(value = "usersCache", key = "#userId")
public String getUserNameById(int userId) {
String sql = "SELECT name FROM users WHERE id = ?";
return jdbcTemplate.queryForObject(sql, String.class, userId);
}
}
এখানে:
getUserNameById
মেথডের জন্য ক্যাশিং নির্ধারণ করা হয়েছে।value
-এ ক্যাশের নাম (যেমন usersCache
) এবং key
-এ ক্যাশের কী হিসাবে userId
ব্যবহার করা হয়েছে।userId
এর জন্য কুয়েরি আবার ডেটাবেস থেকে না গিয়ে ক্যাশ থেকে পাওয়া যাবে।<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ehcache.org/ehcache/3.0 http://www.ehcache.org/ehcache/3.0/ehcache.xsd">
<cache alias="usersCache">
<heap>1000</heap> <!-- ক্যাশে সর্বোচ্চ 1000 আইটেম সংরক্ষণ করবে -->
<expiry>
<ttl>10m</ttl> <!-- ক্যাশে সংরক্ষিত ডেটা 10 মিনিট পর এক্সপায়ার হবে -->
</expiry>
</cache>
</ehcache>
Ehcache এবং Redis ক্যাশিং প্রযুক্তির মাধ্যমে আরও উন্নত ক্যাশিং বাস্তবায়ন করা যায়। এগুলো বড় পরিমাণ ডেটা বা ডিস্ট্রিবিউটেড ক্যাশ সিস্টেমের জন্য উপযুক্ত।
Redis ব্যবহার করতে হলে, আপনাকে Spring Data Redis কনফিগারেশন করতে হবে এবং Redis ক্যাশ ম্যানেজার ব্যবহার করতে হবে।
<dependencies>
<!-- Spring Data Redis Dependency -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>3.0.0</version>
</dependency>
<!-- Lettuce Redis Client Dependency -->
<dependency>
<groupId>io.lettuce.core</groupId>
<artifactId>lettuce-core</artifactId>
<version>6.1.5</version>
</dependency>
</dependencies>
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.redis.RedisCacheManager;
import org.springframework.cache.redis.RedisCacheConfiguration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableCaching
public class RedisCacheConfig {
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration cacheConfig = RedisCacheConfiguration.defaultCacheConfig()
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));
return RedisCacheManager.builder(redisConnectionFactory)
.cacheDefaults(cacheConfig)
.build();
}
}
Spring JDBC এর JdbcTemplate
-এর মাধ্যমে Query Caching বাস্তবায়ন করতে, Spring Cache ব্যবহার করা যায়, যা বিভিন্ন ক্যাশ ম্যানেজার (যেমন Ehcache বা Redis) এর সাথে সমন্বয়ে কাজ করে। @Cacheable
অ্যানোটেশন ব্যবহার করে ক্যাশিং সিস্টেমটি খুব সহজে কার্যকর করা যায়। Query Caching ব্যবহারের মাধ্যমে ডেটাবেসে অতিরিক্ত লোড কমানো যায় এবং অ্যাপ্লিকেশনের পারফরম্যান্স বৃদ্ধি পায়।
Spring JDBC-তে Caching ডাটাবেসের সাথে সংযুক্তির ফ্রিকোয়েন্সি এবং লোড কমাতে ব্যবহৃত হয়। Caching ডাটাবেস থেকে ফ্রিকোয়েন্টলি অ্যাক্সেস করা ডেটা স্টোর করে রাখে এবং প্রয়োজন অনুযায়ী তা দ্রুত সরবরাহ করে।
Spring JDBC-তে Caching সাধারণত Ehcache, Caffeine, Hazelcast, বা Spring Cache Abstraction ব্যবহার করে ইমপ্লিমেন্ট করা যায়।
Spring Cache Abstraction একটি ফ্রেমওয়ার্ক-অ্যাগনস্টিক কনফিগারেশন প্রদান করে। এটি ডাটাবেস থেকে প্রাপ্ত ডেটাকে একটি ইন-মেমরি ক্যাশে সংরক্ষণ করে এবং পুনরায় ডেটাবেস কল এড়ায়।
@Cacheable
, @CachePut
, এবং @CacheEvict
অ্যানোটেশন ব্যবহার করা।Maven:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.x.x</version>
</dependency>
Spring Boot-এ Caching চালু করতে @EnableCaching
অ্যানোটেশন ব্যবহার করুন।
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
return new ConcurrentMapCacheManager("users"); // Cache name: "users"
}
}
Ehcache ব্যবহার করলে, একটি ehcache.xml
ফাইল তৈরি করুন।
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.ehcache.org/v3">
<cache alias="users">
<heap unit="entries">100</heap>
<expiry>
<ttl unit="seconds">600</ttl> <!-- Cache 10 মিনিটের জন্য বৈধ -->
</expiry>
</cache>
</config>
Spring Integration:
@Configuration
@EnableCaching
public class EhCacheConfig {
@Bean
public JCacheManagerCustomizer cacheManagerCustomizer() {
return cm -> cm.createCache("users", new MutableConfiguration<>()
.setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.ofMinutes(10)))
.setStoreByValue(false));
}
}
@Service
public class UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Cacheable(value = "users", key = "#id") // Cache data with key = id
public User getUserById(int id) {
String sql = "SELECT * FROM users WHERE id = ?";
return jdbcTemplate.queryForObject(sql, new Object[]{id},
new BeanPropertyRowMapper<>(User.class));
}
}
কোড ব্যাখ্যা:
value
: ক্যাশের নাম।key
: নির্দিষ্ট রেকর্ডের জন্য কী।@CacheEvict(value = "users", key = "#id") // Clear cache for a specific user
public void deleteUserById(int id) {
String sql = "DELETE FROM users WHERE id = ?";
jdbcTemplate.update(sql, id);
}
কোড ব্যাখ্যা:
@CacheEvict
: ডেটাবেস থেকে ডেটা ডিলিট করার পর ক্যাশ থেকে সংশ্লিষ্ট ডেটাও মুছে ফেলে।@CachePut(value = "users", key = "#user.id") // Update cache with the latest data
public User updateUser(User user) {
String sql = "UPDATE users SET name = ?, email = ? WHERE id = ?";
jdbcTemplate.update(sql, user.getName(), user.getEmail(), user.getId());
return user;
}
কোড ব্যাখ্যা:
@CachePut
: ডেটাবেস এবং ক্যাশ উভয়েই নতুন ডেটা আপডেট করে।@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable int id) {
return ResponseEntity.ok(userService.getUserById(id));
}
@DeleteMapping("/{id}")
public ResponseEntity<String> deleteUserById(@PathVariable int id) {
userService.deleteUserById(id);
return ResponseEntity.ok("User deleted and cache cleared.");
}
@PutMapping("/{id}")
public ResponseEntity<User> updateUser(@PathVariable int id, @RequestBody User user) {
user.setId(id);
return ResponseEntity.ok(userService.updateUser(user));
}
}
Spring JDBC-তে Caching ব্যবহারের মাধ্যমে ডেটাবেস অপারেশন দ্রুত এবং কার্যকর করা যায়। @Cacheable
, @CachePut
, এবং @CacheEvict
অ্যানোটেশন ব্যবহার করে সহজেই কাস্টমাইজড ক্যাশিং যুক্ত করা যায়। ছোট থেকে মাঝারি প্রজেক্টের জন্য এটি খুবই কার্যকর। বড় প্রজেক্টে কাস্টম Caching সমাধান বা Distributed Cache (যেমন Redis, Hazelcast) ব্যবহারের প্রয়োজন হতে পারে।
Read more